LIBS =

check_PROGRAMS = simple-pie simple simple-execstack main too-many-strtab main-scoped big-dynstr no-rpath contiguous-note-sections

no_rpath_arch_TESTS = \
  no-rpath-amd64.sh \
  no-rpath-armel.sh \
  no-rpath-armhf.sh \
  no-rpath-hurd-i386.sh \
  no-rpath-i386.sh \
  no-rpath-ia64.sh \
  no-rpath-kfreebsd-amd64.sh \
  no-rpath-kfreebsd-i386.sh \
  no-rpath-mips.sh \
  no-rpath-mipsel.sh \
  no-rpath-powerpc.sh \
  no-rpath-s390.sh \
  no-rpath-sh4.sh \
  no-rpath-sparc.sh

src_TESTS = \
  plain-fail.sh plain-run.sh shrink-rpath.sh set-interpreter-short.sh \
  set-interpreter-long.sh set-rpath.sh add-rpath.sh no-rpath.sh big-dynstr.sh \
  set-rpath-library.sh soname.sh shrink-rpath-with-allowed-prefixes.sh \
  set-rpath-rel-map.sh \
  force-rpath.sh \
  plain-needed.sh \
  output-flag.sh \
  too-many-strtab.sh \
  no-rpath-pie-powerpc.sh \
  build-id.sh \
  invalid-elf.sh \
  endianness.sh \
  contiguous-note-sections.sh \
  no-gnu-hash.sh \
  change-abi.sh \
  grow-file.sh \
  no-dynamic-section.sh \
  args-from-file.sh \
  basic-flags.sh \
  set-empty-rpath.sh \
  phdr-corruption.sh \
  replace-needed.sh \
  replace-add-needed.sh \
  add-debug-tag.sh \
  repeated-updates.sh \
  empty-note.sh \
  print-execstack.sh \
  modify-execstack.sh \
  rename-dynamic-symbols.sh \
  overlapping-segments-after-rounding.sh \
  shared-rpath.sh \
  short-first-segment.sh \
  empty-note.sh

build_TESTS = \
  $(no_rpath_arch_TESTS)

TESTS = $(src_TESTS) $(build_TESTS)

EXTRA_DIST = no-rpath-prebuild $(src_TESTS) no-rpath-prebuild.sh invalid-elf endianness empty-note \
			 overlapping-segments-after-rounding short-first-segment.gz

TESTS_ENVIRONMENT = PATCHELF_DEBUG=1 STRIP=$(STRIP) NM=$(NM) OBJDUMP=$(OBJDUMP) READELF=$(READELF) OBJCOPY=$(OBJCOPY) STRINGS=$(STRINGS)

$(no_rpath_arch_TESTS): no-rpath-prebuild.sh
	@ln -s $< $@

CLEANFILES = big-dynstr.c
clean-local:
	$(RM) -r scratch $(no_rpath_arch_TESTS)

# by default, use -fpic to compile
AM_CFLAGS = -fpic
LDFLAGS_local = -Wl,--disable-new-dtags -Wl,-rpath-link=. -L. $(AM_LDFLAGS)
LDFLAGS_sharedlib = -Wl,--disable-new-dtags -shared -L. $(AM_LDFLAGS)
export NIX_DONT_SET_RPATH=1
export NIX_LDFLAGS=

simple_SOURCES = simple.c
# no -fpic for simple.o
simple_CFLAGS =
simple_LDFLAGS = -Wl,-z,noexecstack

simple_pie_SOURCES = simple.c
simple_pie_CFLAGS = -fPIC -pie

simple_execstack_SOURCES = simple.c
simple_execstack_CFLAGS =
simple_execstack_LDFLAGS = -Wl,-z,execstack

main_SOURCES = main.c
main_LDADD = -lfoo $(AM_LDADD)
main_DEPENDENCIES = libfoo.so
main_LDFLAGS = $(LDFLAGS_local)

main_scoped_SOURCES = main.c
main_scoped_LDADD = -lfoo-scoped $(AM_LDADD)
main_scoped_DEPENDENCIES = libfoo-scoped.so
main_scoped_LDFLAGS = $(LDFLAGS_local)

big-dynstr.c: main.c
	cat $< > big-dynstr.c
	i=1; while [ $$i -le 2000 ]; do echo "void f$$i(void) { };"; i=$$(($$i + 1)); done >> big-dynstr.c

nodist_big_dynstr_SOURCES = big-dynstr.c
big_dynstr_LDADD = -lfoo $(AM_LDADD)
big_dynstr_DEPENDENCIES = libfoo.so
big_dynstr_LDFLAGS = $(LDFLAGS_local)

# somehow bug does not trigger if we use
# normal autotools rules to build the program:
# https://github.com/NixOS/patchelf/pull/303
libbig-dynstr.so: big-dynstr.c
	$(CC) -fPIC -shared -o $@ $<
libbig-dynstr.debug: libbig-dynstr.so
	$(STRIP) --only-keep-debug libbig-dynstr.so -o libbig-dynstr.debug
check_DATA = libbig-dynstr.debug


# declare local shared libraries as programs as:
# - without libtool, only archives (static libraries) can be built by automake
# - with libtool, it is difficult to control options
# - with libtool, it is not possible to compile convenience *dynamic* libraries :-(
check_PROGRAMS += libfoo.so libfoo-scoped.so libbar.so libbar-scoped.so libsimple.so libsimple-execstack.so libbuildid.so libtoomanystrtab.so \
                  phdr-corruption.so many-syms-main libmany-syms.so liboveralign.so libshared-rpath.so

libbuildid_so_SOURCES = simple.c
libbuildid_so_LDFLAGS = $(LDFLAGS_sharedlib) -Wl,--build-id

libfoo_so_SOURCES = foo.c
libfoo_so_LDADD = -lbar $(AM_LDADD)
libfoo_so_DEPENDENCIES = libbar.so
libfoo_so_LDFLAGS = $(LDFLAGS_sharedlib)

libfoo_scoped_so_SOURCES = foo.c
libfoo_scoped_so_LDADD = -lbar-scoped $(AM_LDADD)
libfoo_scoped_so_DEPENDENCIES = libbar-scoped.so
libfoo_scoped_so_LDFLAGS = $(LDFLAGS_sharedlib)

libbar_so_SOURCES = bar.c
libbar_so_LDFLAGS = $(LDFLAGS_sharedlib) -Wl,-rpath,`pwd`/no-such-path

libbar_scoped_so_SOURCES = bar.c
libbar_scoped_so_LDFLAGS = $(LDFLAGS_sharedlib)

libsimple_so_SOURCES = simple.c
libsimple_so_LDFLAGS = $(LDFLAGS_sharedlib) -Wl,-z,noexecstack

liboveralign_so_SOURCES = simple.c
liboveralign_so_LDFLAGS = $(LDFLAGS_sharedlib) -Wl,-z,max-page-size=0x10000

libshared_rpath_so_SOURCES = shared-rpath.c
libshared_rpath_so_LDFLAGS = $(LDFLAGS_sharedlib) -Wl,-rpath=a_symbol_name

libsimple_execstack_so_SOURCES = simple.c
libsimple_execstack_so_LDFLAGS = $(LDFLAGS_sharedlib) -Wl,-z,execstack

too_many_strtab_SOURCES = too-many-strtab.c too-many-strtab2.s
libtoomanystrtab_so_SOURCES = too-many-strtab.c too-many-strtab2.s
libtoomanystrtab_so_LDFLAGS = $(LDFLAGS_sharedlib)

many_syms_main_SOURCES = many-syms-main.c 
many_syms_main_LDFLAGS = $(LDFLAGS_local) 
many_syms_main_LDADD = -lmany-syms $(AM_LDADD)
many_syms_main_DEPENDENCIES = libmany-syms.so
many_syms_main_CFLAGS = -pie
libmany_syms_so_SOURCES = many-syms.c
libmany_syms_so_LDFLAGS = $(LDFLAGS_sharedlib)

no_rpath_SOURCES = no-rpath.c
# no -fpic for no-rpath.o
no_rpath_CFLAGS =

contiguous_note_sections_SOURCES = contiguous-note-sections.s contiguous-note-sections.ld
contiguous_note_sections_LDFLAGS = -nostdlib -T $(srcdir)/contiguous-note-sections.ld
contiguous_note_sections_CFLAGS = -pie

phdr_corruption_so_SOURCES = void.c phdr-corruption.ld
phdr_corruption_so_LDFLAGS = -nostdlib -shared -Wl,-T$(srcdir)/phdr-corruption.ld
phdr_corruption_so_CFLAGS =

many-syms.c:
	i=1; while [ $$i -le 2000 ]; do echo "void f$$i() {};"; i=$$(($$i + 1)); done > $@

many-syms-main.c:
	echo "int main() {" > $@
	i=1; while [ $$i -le 2000 ]; do echo "void f$$i(); f$$i();"; i=$$(($$i + 1)); done >> $@
	echo "}" >> $@

